home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 13, No. 03 (1992-03)(MindCraft Publishing)(Side A).zip / Nibble Volume 13, No. 03 (1992-03)(MindCraft Publishing)(Side A).po / SWAP.S < prev    next >
Text File  |  1996-12-24  |  7KB  |  290 lines

  1. * SWAP VARIABLES
  2. * COPYRIGHT (C) 1982
  3. * DIGIPAC COMPUTER CONSULTING
  4.           REP 40
  5. *
  6. * APPLESOFT USAGE
  7. *
  8.           REP 40
  9. CHKCOM    EQU $DEBE
  10. CHKOPN    EQU $DEBB
  11. CHRGET    EQU $B1
  12. CHRGOT    EQU $B7
  13. FNDLIN    EQU $D61A
  14. FRMNUM    EQU $DD67
  15. GETADR    EQU $E752
  16. LINNUM    EQU $50
  17. SYNERR    EQU $DEC9
  18.           REP 40
  19. *
  20. * ZERO PAGE
  21. *
  22.           REP 40
  23. LEN1      EQU $8
  24. LEN2      EQU $9
  25. NXTLIN    EQU $19
  26. THSLIN    EQU $9B
  27.           REP 40
  28. *
  29. * CONSTANTS
  30.           REP 40
  31.           MSB OFF
  32. COMMA     EQU ','
  33. CLOSE     EQU ')'
  34. QUOTE     EQU '"'
  35. COLON     EQU ':'
  36. EOL       EQU 0
  37. REM       EQU 178
  38. DATA      EQU 131
  39. OPEN      EQU '('
  40. INTEGER   EQU '%'
  41. STRING    EQU '$'
  42.           MSB ON
  43. *
  44. * STORAGE
  45. *
  46. VBLSTR    EQU $200
  47. *
  48.           ORG $9470 
  49. *
  50.           REP 40
  51. *
  52. * MAIN SEQUENCE
  53. *
  54.           REP 40
  55.           JSR CHKOPN     ; IS OPENING '('?
  56.           JSR FRMNUM     ; GET STARTING LINE 
  57.           JSR GETADR
  58.           LDA LINNUM
  59.           STA STRLIN     ; STORE STARTING LINE NUMBER 
  60.           LDA LINNUM+1
  61.           STA STRLIN+1
  62.           JSR CHKCOM
  63.           JSR FRMNUM     ; GET ENDING LINE 
  64.           JSR GETADR
  65.           LDA LINNUM
  66.           STA ENDLIN     ; STORE ENDING LINE NUMBER 
  67.           LDA LINNUM+1
  68.           STA ENDLIN+1
  69. STRTFND   LDA STRLIN     ; RESTORE START LINE # TO ZERO PAGE 
  70.           STA LINNUM
  71.           LDA STRLIN+1
  72.           STA LINNUM+1
  73.           JSR FNDLIN     ; FIND THE STARTING LINE 
  74.           JSR FNDVAR 
  75. STRTSCH   JSR SRCHLIN    ; SEARCH LINE FOR VARIABLES 
  76.           JSR LASTCHK
  77.           LDA #CLOSE     ; IS THIS LAST LINE? 
  78.           CMP LINFLG 
  79.           BNE NULINE     ; NO, GET THE NEXT LINE 
  80.           LDA #CLOSE     ; ARE THERE MORE VARIABLES? 
  81.           CMP ENDFLG 
  82.           BNE STRTFND    ; THEN GET NEXT SET OF VARIABLES 
  83.           RTS            ; RETURN TO BASIC
  84. NULINE    JSR NEXTLINE 
  85.           JMP STRTSCH
  86.           REP 40
  87. *
  88. * FIND AND STORE VARIABLES
  89. *
  90.           REP 40
  91. FNDVAR    JSR CHRGOT
  92.           CMP #COMMA     ; IF NO COMMA THEN SYNTAX ERROR 
  93.           BEQ INITIAL 
  94. ERR       JSR SYNERR
  95. INITIAL   LDX #0
  96.           LDY #0
  97.           JSR GETCHAR
  98.           CPX #0 
  99.           BEQ ERR        ; NO FIRST VARIABLE 
  100.           CMP #CLOSE  
  101.           BEQ ERR        ; NO SECOND VARIABLE ERROR 
  102.           DEX
  103.           STX LEN1       ; STORE LENGTH OF FIRST VARIABLE 
  104.           LDX #0
  105.           JSR GETCHAR
  106.           CPX #0         ; SECOND VARIABLE IS A BLANK 
  107.           BEQ ERR        ;NO SECOND VARIABLE ERROR 
  108.           DEX
  109.           STX LEN2       ; STORE SECOND VARIABLE LENGTH 
  110.           RTS
  111.           REP 40
  112. *
  113. * SEARCH THE LINE
  114. *
  115.           REP 40
  116. SRCHLIN   LDX #0 
  117.           JSR OLDLNK 
  118.           JSR LASTCHK
  119.           LDY #4
  120. GETDAT    LDA (THSLIN),Y ; GET CHARACTER, THEN CHECK FOR 
  121.           CMP #EOL       ; : END OF LINE 
  122.           BEQ RETURN1
  123.           CMP #REM       ; : REM? 
  124.           BEQ RETURN1
  125.           CMP #QUOTE     ; : QUOTED STRING? 
  126.           BEQ STRTQUO
  127.           CMP #DATA      ; : DATA STATEMENT? 
  128.           BEQ STRTDAT
  129.           CMP VBLSTR,X   ; COMPARE TO STORED VARIABLE 
  130.           BEQ STRGSAM
  131.           INY
  132.           LDX #0
  133.           JMP GETDAT     ; NO MATCH- GET ANOTHER 
  134. STRGSAM   CPX LEN1       ; IF END OF VARIABLE NAME REACHED 
  135.           BEQ SWAP       ; THEN GO TO SWAP 
  136.           INX            ; ELSE GET ANOTHER CHARACTER 
  137.           INY
  138.           JMP GETDAT
  139. SWAP      JSR SWAPVAR    ; RUN SWAPPING ROUTINE 
  140.           INY
  141.           LDX #0         ; RESET FOR NEXT OCCURANCE 
  142.           JMP GETDAT
  143. STRTDAT   LDA #COLON     ; FIND NEXT BASIC STATEMENT 
  144.           STA COMPAR 
  145.           JSR FINDCLS
  146. NEWSTM    CMP #EOL 
  147.           BEQ RETURN1 
  148.           JMP GETDAT
  149. STRTQUO   LDA #QUOTE     ; FIND ENDING QUOTE 
  150.           STA COMPAR 
  151.           JSR FINDCLS 
  152.           JMP NEWSTM
  153. RETURN1   RTS 
  154.           REP 40
  155. *
  156. * MAKE THE SWAP
  157. *
  158.           REP 40
  159. SWAPVAR   INY
  160.           LDA (THSLIN),Y ; CHECK FOR VARIABLE TYPE MATCH
  161.           CMP #STRING
  162.           BEQ RETURN2
  163.           CMP #INTEGER
  164.           BEQ RETURN2
  165.           CMP #OPEN
  166.           BEQ RETURN2
  167.           DEY            ; MOVE POINTER TO BEG OF VARIABLE 
  168.           TYA
  169.           SEC
  170.           SBC LEN1
  171.           TAY
  172.           INX
  173.           LDA LEN2       ; USE VARIABLE LENGTH 2 AS A COUNTER
  174.           STA VBLLEN
  175.           INC VBLLEN
  176. MOVCHAR   LDA VBLSTR,X 
  177.           STA (THSLIN),Y ; MAKE THE SWAP 
  178.           INY
  179.           INX
  180.           DEC VBLLEN 
  181.           BNE MOVCHAR    ; ALL SECOND VARIABLE TRANSFERRED? 
  182.           JSR MAKLEN
  183.           RTS
  184. RETURN2   DEY
  185.           RTS
  186.           REP 40
  187. *
  188. * FIND END OF QUOTE OR DATA STATEMENT 
  189. *
  190. FINDCLS   INY
  191. NEXT1     LDA (THSLIN),Y
  192.           CMP #EOL       ; LOOK FOR END OF LINE 
  193.           BEQ ENDLIN1
  194.           INY
  195.           CMP COMPAR     ; LOOK FOR COLON OR QUOTE 
  196.           BNE NEXT1
  197. ENDLIN1   RTS
  198.           REP 40
  199. *
  200. * GET AND STORE A VARIABLE CHARACTER
  201. *
  202.           REP 40
  203. GETCHAR   LDA #0 
  204.           STA ENDFLG     ; CLEAR END FLAG 
  205. GETCHR1   JSR CHRGET     ; NEXT CHARACTER IN CALLING SEQUENCE 
  206.           CMP #COMMA     ; EACH VARIABLE TERMINATED BY ',' 
  207.           BEQ RETURN3 
  208.           CMP #CLOSE     ; OR ')' 
  209.           BEQ CLOSE1
  210.           STA VBLSTR,Y   ; SAVE THE CHARACTER 
  211.           INX
  212.           INY
  213.           JMP GETCHR1    ; GET ANOTHER CHARACTER 
  214. CLOSE1    JSR CHRGET
  215.           LDA #CLOSE     ; LAST VARIABLE FOUND 
  216.           STA ENDFLG
  217. RETURN3   RTS
  218.           REP 40
  219. *
  220. * CHECK IF LAST LINE REACHED
  221. *
  222.           REP 40
  223. LASTCHK   LDY #3 
  224.           LDA (THSLIN),Y
  225.           CMP ENDLIN+1   ; COMPARE CURRENT LINE# TO LAST 
  226.           BCC RETURN4
  227.           DEY
  228.           LDA (THSLIN),Y
  229.           CMP ENDLIN
  230.           BCC RETURN4
  231.           LDA #CLOSE     ; SET THE LAST LINE FLAG 
  232.           STA LINFLG 
  233.           RTS
  234. RETURN4   LDA #0
  235.           STA LINFLG
  236.           RTS
  237.           REP 40
  238. *
  239. * SET POINTER TO NEXT LINE
  240. *
  241.           REP 40
  242. NEXTLINE  LDA NXTLIN 
  243.           STA THSLIN
  244.           LDA NXTLIN+1
  245.           STA THSLIN+1
  246.           RTS 
  247.           REP 40
  248. * SAVE THE NEXT LINK ADDRESS
  249. *
  250.           REP 40
  251. OLDLNK    LDY #0
  252.           LDA (THSLIN),Y ;SAVE NEXT LINE ADDRESS 
  253.           STA NXTLIN
  254.           INY
  255.           LDA (THSLIN),Y
  256.           STA NXTLIN+1 
  257.           RTS
  258.           REP 40
  259. *
  260. * MAKE LENGTH OF VARIABLES THE SAME
  261. *
  262.           REP 40
  263. MAKLEN    LDA LEN1
  264.           SEC
  265.           SBC LEN2
  266.           BEQ RETURN5    ; IF SAME LENGTH THEN EXIT 
  267.           BMI RETURN5    ; IF LEN1 < LEN 2 THEN EXIT
  268.           STA TEMP       ; SAVE LENGTH REMAINING
  269. STORBLK   LDA #$20
  270.           STA (THSLIN),Y ; SAVE A BLANK
  271.           INY
  272.           DEC TEMP
  273.           BNE STORBLK
  274. RETURN5   RTS
  275.           REP 40
  276. *
  277. * STORAGE
  278. *
  279.           REP 40
  280. COMPAR    DS 1
  281. ENDFLG    DS 1
  282. ENDLIN    DS 2
  283. LINFLG    DS 1
  284. STRLIN    DS 2
  285. VBLLEN    DS 1
  286. TEMP      DS 1
  287.           LST OFF
  288.